package Test;

class MyArr<T> {    //第一步:添加类型参数<T>(可以是任何字母,通常用T,E,K,V)
    public Object[] arr=new Object[10];//泛型本身不能进行实例化!

    public void set(int pos,T x) {//第二步,赋值时要进行强制类型转换
        arr[pos]=x;
    }

    public T get(int pos) {
        return (T)arr[pos];//第三步接收返回值时,需要强制类型转换
    }
}

public class Test6 {

    public static void main(String[] args) {
        MyArr raw=new MyArr();//编译器会警告:Raw use of parameterized class 'MyArr'
        raw.set(0,1);//可以传入任何对象
        raw.set(1,'a');
        raw.set(2,1.0);
        char c=(char)raw.get(1);//接收时必须进行强制转换
        //可能抛出ClassCastException
    }


    public static void main2(String[] args) {
        MyArr<String> myArr=new MyArr<>();//指定类型为String
        myArr.set(0,"hello");
//        myArr.set(1,100);//编译报错!泛型检查出了类型不匹配

        String s=myArr.get(0);
//        Integer i=myArr.get(0);//编译报错!泛型检查出了类型不匹配
    }
    public static void main1(String[] args) {
        MyArr myArr=new MyArr();
        myArr.set(0,1);//自动装箱为Integer类型
        myArr.set(1,2.0);//自动装箱为Double类型
        myArr.set(2,"hello");//String本身就是引用类型,直接继承Object
//        String s2=(String)myArr.get(2);//Object->String
//        String s1=myArr.get(2);//向下转型必须显式
//        String s3=(String)myArr.get(0);


    }
}

